
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>RabbitMQ交换机的类型有那些 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>RabbitMQ交换机的类型有那些 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">在RabbitMQ中，交换机（Exchange）的核心作用是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">交换机是消息路由的核心组件。它接收来自生产者的消息，并根据特定的路由规则（如绑定和路由键）将这些消息分发到适当的队列中。同时，它在生产者和消费者之间起到了解耦的作用。</div>
          </div>
          <div class="card-source">来源: 文档中「交换机在消息路由中的作用」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">RabbitMQ提供了哪四种主要的交换机类型？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">RabbitMQ提供了四种主要的交换机类型，分别是：Direct Exchange（直连交换机）、Fanout Exchange（扇出交换机）、Topic Exchange（主题交换机）和 Headers Exchange（头交换机）。</div>
          </div>
          <div class="card-source">来源: 文档中「交换机的主要类型」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Fanout Exchange（扇出交换机）的路由机制是怎样的？它适用于什么场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Fanout Exchange将接收到的消息广播到所有绑定到它的队列中，它会忽略消息的路由键。这种广播机制适用于需要将消息广播给多个消费者的场景，例如发布订阅模式或事件通知系统。</div>
          </div>
          <div class="card-source">来源: 文档中「Fanout Exchange」部分的「工作原理」和「应用场景」小节</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Direct Exchange（直连交换机）是如何根据路由键（Routing Key）进行消息路由的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Direct Exchange通过精确匹配来进行路由。它会将消息的路由键与队列的绑定键（Binding Key）进行比较，只有当两者完全相同时，消息才会被路由到该队列。</div>
          </div>
          <div class="card-source">来源: 文档中「Direct Exchange」部分的「工作原理」小节</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Topic Exchange（主题交换机）在进行模式匹配时，使用了哪两个特殊字符？它们分别代表什么含义？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Topic Exchange在绑定键中使用两个特殊字符进行模式匹配：星号“*”用于匹配一个单词；井号“#”用于匹配零个或多个单词。单词之间用点“.”分隔。</div>
          </div>
          <div class="card-source">来源: 文档中「Topic Exchange」部分的「工作原理」小节</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Headers Exchange（头交换机）与其他交换机在路由依据上有什么根本不同？它的匹配规则由哪个参数控制？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Headers Exchange不依赖于路由键，而是根据消息头（Headers）中的属性进行路由。它的匹配规则由绑定时设置的特殊参数“x-match”控制，该参数的值可以是“all”（表示所有键值对都必须匹配）或“any”（表示任何一个键值对匹配即可）。</div>
          </div>
          <div class="card-source">来源: 文档中「Headers Exchange」部分的「工作原理」小节</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">为了实现RabbitMQ的高可用性，确保消息在服务重启后不丢失，需要对哪些组件进行持久化设置？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">需要对三个组件进行持久化设置：1. 持久化交换机（在声明时设置）；2. 持久化队列（在声明时设置）；3. 持久化消息（通过设置消息属性中的deliveryMode为2）。</div>
          </div>
          <div class="card-source">来源: 文档中「交换机的容错和高可用」部分的「消息持久化」小节</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">什么是镜像队列（Mirrored Queues），它如何提高RabbitMQ的可用性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">镜像队列是RabbitMQ提供的一种高可用性机制，它将一个队列中的消息镜像（复制）到集群中的多个节点。如果持有主队列的节点发生故障，RabbitMQ会自动将一个镜像节点提升为新的主节点，从而保证服务不中断。</div>
          </div>
          <div class="card-source">来源: 文档中「交换机的容错和高可用」部分的「镜像队列」小节</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">在构建一个日志系统时，如果希望根据日志级别（如INFO, ERROR）和来源（如auth, app）进行灵活路由，应该选择哪种类型的交换机？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">应该选择Topic Exchange。因为它支持基于模式匹配的灵活路由机制，可以轻松实现如“*.error”（匹配所有错误日志）或“auth.#”（匹配所有与认证相关的日志）这样的复杂路由规则。</div>
          </div>
          <div class="card-source">来源: 文档中「Topic Exchange」部分的「应用场景」小节</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
